/** * * Copyright to the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at: * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software distributed under the License is * distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and limitations under the License. */ package com.github.born2snipe.maven.plugin.idea.packaging; import org.apache.commons.io.FileUtils; import org.apache.maven.artifact.DependencyResolutionRequiredException; import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; import org.apache.maven.plugins.annotations.LifecyclePhase; import org.apache.maven.plugins.annotations.Mojo; import org.apache.maven.plugins.annotations.Parameter; import org.apache.maven.plugins.annotations.ResolutionScope; import org.apache.maven.project.MavenProject; import zipunit.ZipBuilder; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.util.Iterator; @Mojo(name = "package-plugin", requiresProject = true, requiresDependencyResolution = ResolutionScope.RUNTIME, defaultPhase = LifecyclePhase.PACKAGE) public class PackagingMojo extends AbstractMojo { @Parameter(defaultValue = "${project.build.outputDirectory}") private File buildOutputDir; @Parameter(defaultValue = "${project.build.finalName}") private String zipName; @Parameter(defaultValue = "${project.name}") private String pluginName; @Parameter(defaultValue = "${project.build.directory}") private File buildDir; @Parameter(required = true, readonly = true, property = "project") private MavenProject project; private boolean deletePluginJar = true; @Override public void execute() throws MojoExecutionException, MojoFailureException { long start = System.currentTimeMillis(); if (doesBuildDirectoryNotExist()) { return; } File pluginJar = buildPluginJarFile(); buildPluginBundle(pluginJar); if (deletePluginJar) { pluginJar.delete(); } getLog().info("Packaged plugin in " + (System.currentTimeMillis() - start) + " millis"); } private boolean doesBuildDirectoryNotExist() { return !buildDir.exists() || !buildOutputDir.exists(); } private void buildPluginBundle(File pluginJar) { ZipBuilder zipBuilder = new ZipBuilder(buildDir); addToBundle(pluginJar, zipBuilder); addDependenciesToBundle(zipBuilder); zipBuilder.build(zipName + ".zip"); } private void addDependenciesToBundle(ZipBuilder zipBuilder) { try { for (String classPathElement : project.getRuntimeClasspathElements()) { if (isOutputDirectory(classPathElement)) { continue; } addToBundle(new File(classPathElement), zipBuilder); } } catch (DependencyResolutionRequiredException e) { throw new RuntimeException(e); } } private boolean isOutputDirectory(String path) { return buildOutputDir.getAbsolutePath().equals(path); } private void addToBundle(File jarFile, ZipBuilder zipBuilder) { zipBuilder.withEntry(pluginName + "/lib/" + jarFile.getName(), inputStreamFor(jarFile)); } private File buildPluginJarFile() { ZipBuilder zipBuilder = new ZipBuilder(buildDir); Iterator<File> iterator = FileUtils.iterateFiles(buildOutputDir, null, true); while (iterator.hasNext()) { File file = iterator.next(); String entry = convertToEntryPath(file); zipBuilder.withEntry(entry, inputStreamFor(file)); } zipBuilder.withEntry("META-INF/MANIFEST.MF", "Manifest-Version: 1.0\n" + "Created-By: IntelliJ IDEA\n"); return zipBuilder.build(pluginName + ".jar"); } private String convertToEntryPath(File file) { String wholePath = file.getAbsolutePath(); String outputPath = buildOutputDir.getAbsolutePath(); return wholePath.replace(outputPath + File.separator, ""); } private BufferedInputStream inputStreamFor(File file) { try { return new BufferedInputStream(new FileInputStream(file)); } catch (FileNotFoundException e) { throw new RuntimeException(e); } } public void setBuildOutputDir(File buildOutputDir) { this.buildOutputDir = buildOutputDir; } public void setZipName(String zipName) { this.zipName = zipName; } public void setPluginName(String pluginName) { this.pluginName = pluginName; } public void setBuildDir(File buildDir) { this.buildDir = buildDir; } public void setDeletePluginJar(boolean deletePluginJar) { this.deletePluginJar = deletePluginJar; } public void setProject(MavenProject project) { this.project = project; } }